/**

返回与给定先序遍历 preorder 相匹配的二叉搜索树（binary search tree）的根结点。

(回想一下，二叉搜索树是二叉树的一种，其每个节点都满足以下规则，对于 node.left 的任何后代，值总 < node.val，而 node.right 的任何后代，值总 > node.val。此外，先序遍历首先显示节点的值，然后遍历 node.left，接着遍历 node.right。）

 

示例：

输入：[8,5,1,7,10,12]
输出：[8,5,10,1,7,null,12]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/construct-binary-search-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void insert(TreeNode * &root,TreeNode * newnode)
    {
        if(root == 0)
        {
            root = newnode;
            return;
        } 

        TreeNode * node = root;
        while(node)
        {
            if(newnode->val < node ->val)
            {
                if(node -> left)
                    node = node ->left;
                else
                {
                    node -> left = newnode;
                    return ;
                }
            }
            else
            {
                if(node -> right)
                    node = node -> right;
                else
                {
                    node -> right = newnode;
                    return ;
                }  
            }
        }
    }
    TreeNode* bstFromPreorder(vector<int>& preorder) {
        TreeNode * root = 0;
        for(int i=0;i<preorder.size();i++)
        {
            insert(root,new TreeNode(preorder[i]));
        }
        return root;
    }
};